每周TODO知识点总结 第一期

Java基础相关

1、正则表达式里,字符串“*”写成“\\*”,“\”写成“\\\\”,为什么?

  • 注意以下两点:

    • 1.字符串里面表示斜杠就需要两个斜杠如“\\”
    • 2.正则表达式里的斜杠需要转意,是用“\”标示。
  • 所以对于“\\\\”,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身。这样就成了4个斜杠在正则表达式里面表示一个斜杠。

  • 更多知识点:

    • 引用说明:有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为“/”;反斜杠的符号为“\”。斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符‘/’;
    • 反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如“\n”(表示换行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符’\’要用“\\”来表示,例:如果你这样定义一个字符串String s = “name\sex”是错误的,要这样定义String s = “name\\sex”;

2、Java中的String.replace()和String.replaceAll()的区别?

  • 如果获得一个Matcher,Matcher m = Pattern.compile(“\\”).matcher(“\\”)将会报错,你应当这样写Matcher m = Pattern.compile(“\\\\”).matcher(“\\”)才是正确且匹配的引用
  • String类中replace(CharSequence target,CharSequence replacement)方法与replaceAll(String regex, String replacement)方法的区别如下:

    public static void main(String[] arg) throws OgnlException {
        String s ="sdf\\a\\aa";
    
        //把s中的反斜杠\ 替换为\\
        System.out.println(s);
        System.out.println(s.replaceAll("\\\\", "\\\\\\\\"));
        System.out.println(s.replace("\\", "\\\\"));
    }
    
  • 上面两种都返回相同的替换结果。这里的关键是String.replaceAll()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串“\\”(其中包含两个char)。接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。
  • 所以假设 String.replaceAll()是以普通字符串,而不是regex作为参数,那么这样写代码: String target = source.replaceAll(‘\\’, ‘\\\\’); 就可以了。其实就是replace的写法。

3、什么是字典序,为什么字符串数组中最大的串是字典序排在最后的串?

  • 根据ASCII排,具体如下:

    0-9(对应数值48-59);
    A-Z(对应数值65-90);
    a-z(对应数值97-122);
    
  • 标准序: 短在前,长在后,等长的依次比字母

    如to < up < cap < cat < too < two <boat < boot < card
    
  • 字典序: 依次比字母(按字典里的顺序比较)

    如boat < boot <cap < card < cat < to < too< two < up
    
  • 字典序是不忽略字符的大小写的,大写字符排在小写字符前

    如:“ZEBRA” < "alligator"
    
  • Comparable接口的compareTo不忽略字符的大小写,按照字典排序

    public int compareTo(String anotherString)  
    
    compareTo 按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。 
    

Linux基础相关

1、echo相关知识点:

  • cat 和 echo 的区别:

    cat:Concatenate FILE(s), or standard input, to standard output.
    echo: Echo the STRING(s) to standard output.
    
  • echo > 和 ehco >> 的区别:>>是追加,>是覆盖

  • shell中echo \$+变量与echo ${变量}的区别:

    如变量ABC=123, echo $ABC 与 echo ${ABC} 在绝大多数情况下是一致的
    不过后者更好,因为没有歧义。
    如还存在一个变量AB=888
    那么$ABC是什么呢?
    1. $ABC = $AB + "C" = 888 + "C" = 888C
    2. $ABC = 123
    如果使用${ABC}就没有这样的疑惑,SHELL很容易确定你要的就是变量ABC 
    
  • echo 字符串 和 echo $字符串 的区别:

    echo 字符串-------->打印字符串
    echo $字符串------->此时的字符串就相当于一个变量,打印的是变量的值,比如 echo $PATH,这个命令就是在屏幕上输出环境变量
    
  • @echo off在bat文件中的作用:

    echo [{on off}] [message]
    Sample:@echo off / echo hello world
    
    echo off是关闭回显的功能。在没有关闭回显的情况下,每行命令都会在屏幕上显示一遍,而关闭回显后,屏幕就只显示命令的执行结果了。当再次出现echo on时下面的语句才为可见的(回显),echo通常和@一起使用,@放在echo的前面,即是@echo,作用是让@后面的句子不显示出来,而@本身也是不显示的,那么通过 @echo off 可达到不显示任何信息的效果。
    
    举个例子:
    @echo off
    echo 123
    显示的结果为:123
    而
    echo 123的结果为:
    echo 123
    123
    

2、什么是RAID中的chuck size?

  • RAID:(Redundant Array of indenpensive Disk) 独立磁盘冗余阵列: 磁盘阵列是把多个磁盘组成一个阵列,当作单一磁盘使用,它将数据以分段(striping)的方式储存在不同的磁盘中,存取数据时,阵列中的相关磁盘一起动作,大幅减低数据的存取时间,同时有更佳的空间利用率。磁盘阵列利用的不同的技术,称为RAID level,不同的level针对不同的系统及应用,以解决数据安全的问题。简单来说,RAID把多个硬盘组合成为一个逻辑扇区,因此,操作系统只会把它当作一个硬盘。

  • 一般高性能的磁盘阵列都是以硬件的形式来达成,进一步的把磁盘存取控制及磁盘阵列结合在一个控制器(RAID controler)或控制卡上,针对不同的用户解决人们对磁盘输输入输出系统的四大要求:

    • (1)增加存取速度,
    • (2)容错(fault tolerance),即安全性
    • (3)有效的利用磁盘利用率;
    • (4)尽量的平衡CPU,内存及磁盘的性能差异,提高主机的整体工作性能。
  • Chunk:可以理解为raid分储数据时每个数据段的大小(通常为32/64/128等这类数字大小)。合理的选择chunk大小非常重要,若chunk过大可能一块磁盘上的带区空间就可以满足大部分的I/O操作,使得数据的读写只局限于一块硬盘上,这便不能充分发挥RAID并发的优势;如果chunk设置过小,任何很小的I/O指令都可能引发大量的读写操作,不能良好发挥并发性能,占用过多的控制器总线带宽,也影响了阵列的整体性能。一般缺省为64字节。

  • 详细信息请移步:Linux阵列 RAID详解


Android相关

1、如何自定义绘制圆形进度条?

  • 效果图如下:

此处输入图片的描述


计算机基础相关

1、什么是海明码,为什么说海明码是具有纠错功能的校验码?

  • 海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。

  • 海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。

  • 海明码纠错的详细步骤请移步:


2、什么是逻辑异或运算?

  • 异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:

    a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
    
  • 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
  • 异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
输入 运算符 输入 结果
1 0 1
1 1 0
0 0 0
0 1 1

3、理解硬盘的CHS,即柱面(Cylinder),磁头(Heads),扇区(Sector)。

此处输入图片的描述
此处输入图片的描述

  • 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。

  • 磁道:Track,可以理解为一个圆形盘片由许许多多的同心圆组成,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。(硬盘是一个高速旋转的东西,当磁盘旋转时,磁头若保持在一个位置上不动,则磁头会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道)

  • 扇区:Sector,可以联想到“扇形区域”,磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,磁盘驱动器在向磁盘读取和写入数据时应该以扇区为单位。

  • 柱面:Cylinder,硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的0开始编号,具有相同编号的磁道形成一个圆柱,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用。显然,磁盘的柱面数与一个盘面上的磁道数是相等的。

  • 磁头:Heads,当然是读取信息用的了。每个盘面都有自己的磁头,如果盘面的双面都记录信息,那么双面都应该有磁头。所以,硬盘的容量计算公式如下:硬盘的容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数(512)

  • SDK中定义了一个叫做DISK_GEOMETRY的结构体:

    typedef struct _DISK_GEOMETRY
    {
        LARGE_INTEGER Cylinders;
        MEDIA_TYPE MediaType;
        DWORD TracksPerCylinder;
        DWORD SectorsPerTrack;
        DWORD BytesPerSector;
    } DISK_GEOMETRY;
    

此处输入图片的描述

  • 对于不同的硬盘,固件区的物理位置是不同的,有的位于比“0”磁道更靠近磁盘片外缘的磁道上,即我们常说的“负磁道”。有的位于磁盘片的中部,所记录的程序的数量和功能也有差别。由于生产过程中不可能保证整个盘片完全一致,必然有少部分扇区无法稳定读写数据,这就是我们所说的坏道。

此处输入图片的描述